openlayers自定义投影坐标系(EPSG:4542),GeoJSON读取geometry和坐标转换

您所在的位置:网站首页 openlayer3 设置bd09 openlayers自定义投影坐标系(EPSG:4542),GeoJSON读取geometry和坐标转换

openlayers自定义投影坐标系(EPSG:4542),GeoJSON读取geometry和坐标转换

2024-07-15 13:09| 来源: 网络整理| 查看: 265

在做二三维开发中时常会遇见,形形色色各种类型的投影坐标系,然额不管是OL还是CESIUM他们都只支持EPSG:3857和EPSG:4326类型的坐标系,所有我们不得不将 其他类型的投影坐标转换为4326或者3857,目前比较好用的要属proj4, 当时刚开始使用也是十分笨拙,走了些弯路…

项目中时常会得到shp转换的大量geojson数据 如: geojson 这种一大堆的坐标系,且需要全部转换,

起初我是这样做的:

1、拿到所有的featurens, 2、申明一个临时变量来保存所有的features 3、然后循环调用convert2000CoorTo84转换 4、再把转换后的值push到临时变量中, 5、返回一个转换坐标后的geometry

// 调用后台接口获取到res axios.get('/getGeojson').then(res=>{ let tempRes = res; let features = res.features; tempRes.features = []; let coordinates, positions; features.map(feature => { var tempFe = feature; coordinates = feature.geometry.coordinates[0][0]; var platArr = []; for (var i = 0; i { console.log(err) })

6、定义一个转换的函数

function convert2000CoorTo84(targetArr) { //根据自己的坐标系参数定义 proj4字符串 var wgs84 = '+proj=longlat +datum=WGS84 +no_defs'; var cgcs2000 = '+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs'; var convertRes = proj4(cgcs2000, wgs84, targetArr); //将cgcs2000坐标转换成wgs84坐标 return convertRes; }

这种转换是可以的,但是太笨拙了费时费力!

于是想这有没有更简单的转换方法呢?不可能大量数据这样循环转换吧,一找还真有

看在官网中找到如下案例 官网案例 于是根据案例修改自己的代码

1、引入proj4

import proj4Tool from 'proj4' import { register } from 'ol/proj/proj4'; import GeoJSON from 'ol/format/GeoJSON';

2、定义扩展的EPSG

defineExtarProject() { proj4Tool.defs([ [ 'EPSG:4543', '+proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs' ], [ 'EPSG:4542', '+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs' ], [ 'EPSG:26713', '+proj=utm +zone=13 +ellps=clrk66 +datum=NAD27 +units=m +no_defs' ] ]); register(proj4Tool); }

4、读取数据并转换坐标系

_readGeometryFromGeojson(geoJson, orgEpsg="EPSG:4326") { if (typeof (geoJson) === 'string') { try { geoJson = JSON.parse(geoJson) } catch (error) { console.log('convert data ...', error) } } var geojsonFeature = new GeoJSON().readFeature(geoJson, { dataProjection: orgEpsg, // 元数据的投影坐标 featureProjection: "EPSG:4326" //规定要素以哪种坐标显示 }); return geojsonFeature; }

5、获取数据

// 调用后台接口获取到geojson axios.get('/getGeojson').then(geojson=>{ this._readGeometryFromGeojson(geojson, 'EPSG:4542'); }).catch(err=>{ console.log(err) })

OK数据读取和转换一气呵成,看到这里真有种 I felt a fool when I realized my mistake.

有的时候处理问题,结果虽然出来了,但有可能解决方式并非最优的,找寻更好的解决办法,减轻工作量提高工作效率才是最终目的

哦这里还记录下EPSG查询方式

直接可以使用https://epsg.io/3395就可以查询到对应的EPSG:3395的投影定义

epsg查询

还有种方式就是直接输入http://spatialreference.org/ref/epsg/3395/proj4/ 方便快捷 epsg查询

OK记录问题加深记忆希望对自己有所启发,也希望可以帮助到需要的朋友,谢谢。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3